package com.hzncc.flowable_diboot.config;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.diboot.core.binding.QueryBuilder;
import com.diboot.core.holder.ThreadLocalHolder;
import com.diboot.core.util.ContextHolder;
import com.diboot.core.util.S;
import com.diboot.iam.util.IamSecurityUtils;
import com.diboot.tenant.entity.IamTenant;
import com.diboot.tenant.handler.DefaultTenantHandler;
import com.diboot.tenant.service.IamTenantService;
import com.hzncc.flowable_diboot.common.ItemsList;
import com.hzncc.flowable_diboot.entity.contract.Contract;
import com.hzncc.flowable_diboot.service.impl.RoleTenantServiceImpl;
import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.expression.StringValue;
import net.sf.jsqlparser.expression.operators.relational.ExpressionList;
import org.springframework.stereotype.Component;

import java.util.Collections;
import java.util.List;
import java.util.Set;

/**
 * @author GaoGuoPei
 * @describe
 * @date 2024/3/1
 **/
@Component
public class CustomTenantLineHandler extends DefaultTenantHandler {

    static {
        // 添加需要拦截的表
        TENANT_IGNORE_TABLE.add("custom_table");
        TENANT_IGNORE_TABLE.add("mdl_basic_sales_org");
        TENANT_IGNORE_TABLE.add("mdl_customer_account_group");
        TENANT_IGNORE_TABLE.add("dbtlc_page_design");
        TENANT_IGNORE_TABLE.add("dbtlc_meta_model");
        TENANT_IGNORE_TABLE.add("mdl_sales_config");
        TENANT_IGNORE_TABLE.add("KNA1_X");
        TENANT_IGNORE_TABLE.add("KNA1_X_copy1");
        TENANT_IGNORE_TABLE.add("KNBK");
        TENANT_IGNORE_TABLE.add("mdl_regional_coordinates");
        TENANT_IGNORE_TABLE.add("iam_role_tenant");
        TENANT_IGNORE_TABLE.add("mdl_ding_app_config");
        TENANT_IGNORE_TABLE.add("mdl_field_mapping");
        TENANT_IGNORE_TABLE.add("mdl_oa_template");
        TENANT_IGNORE_TABLE.add("KONP");
        TENANT_IGNORE_TABLE.add("mdl_interface_log");
        TENANT_IGNORE_TABLE.add("RankedRecords");
        TENANT_IGNORE_TABLE.add("mdl_old_receive");
        TENANT_IGNORE_TABLE.add("mdl_international_customer_area");
        TENANT_IGNORE_TABLE.add("mdl_oa_user");
        TENANT_IGNORE_TABLE.add("mdl_oa_dept");
        TENANT_IGNORE_TABLE.add("mdl_bpm_service_config");
    }

    // 这是 default 方法,默认返回 false 表示所有表都需要拼多租户条件
    @Override
    public boolean ignoreTable(String tableName) {
        return TENANT_IGNORE_TABLE.contains(tableName) || ThreadLocalHolder.ignoreInterceptor();
    }


    public ExpressionList getTenantIdList() {
        // 获取可访问租户列表
        RoleTenantServiceImpl roleTenantService = ContextHolder.getBean(RoleTenantServiceImpl.class);
        List<Expression> accessibleTenant = roleTenantService.getAccessibleTenant();
        return new ItemsList(accessibleTenant);
    }

    /**
     * 获取可访问租户列表
     * 如果是回款登记且公司编码为1001添加财务租户
     *
     * @param name 模块名称，用于判断是否需要添加特殊租户
     * @return 包含可访问租户ID的表达式列表
     */
    public Expression getTenantIdList(String name) {
        // 定义特殊模块名称集合，用于判断是否需要添加特殊租户
        Set<String> special = Set.of("mdl_payment_register", "mdl_sap_customer","mdl_sales_group_content");
        // 获取当前用户可访问的租户ID列表
        ExpressionList tenantIdList = getTenantIdList();
        // 如果模块名称不在特殊模块集合中，则直接返回租户ID列表
        if (!special.contains(name)) {
            return tenantIdList;
        }
        // 获取IAM租户服务实例
        IamTenantService tenantService = ContextHolder.getBean(IamTenantService.class);
        // 获取当前租户信息
        IamTenant currentTenant = tenantService.getEntity(IamSecurityUtils.getCurrentTenantId());
        // 如果是回款登记模块且当前租户的公司编码为1001，则添加财务租户到列表中
        if (S.equals(name, "mdl_payment_register")) {
            if (S.equals(currentTenant.getOaNum(), "1001")) {
                // 查询财务租户信息
                IamTenant cw = tenantService.lambdaQuery().select(IamTenant::getId).eq(IamTenant::getCode, "cw").one();
                // 将财务租户ID添加到租户ID列表中
                tenantIdList.add(new StringValue(cw.getId()));
            }
        }
        // 如果是SAP客户模块，则添加与当前租户相同组织ID的租户到列表中
        if (S.equals(name, "mdl_sap_customer") || S.equals(name, "mdl_sales_group_content")) {
            // 获取当前租户的组织ID
            String orgId = currentTenant.getOrgId();
            // 创建查询条件，模糊匹配组织ID
            QueryWrapper<IamTenant> queryWrapper = new QueryWrapper<>();
            queryWrapper.like("org_id", orgId);
            // 查询符合组织ID条件的租户列表
            List<IamTenant> entityList = tenantService.getEntityList(queryWrapper);
            // 遍历查询结果，将租户ID添加到租户ID列表中
            entityList.forEach(iamTenant -> {
                tenantIdList.add(new StringValue(iamTenant.getId()));
            });
        }
        // 返回包含可访问租户ID的表达式列表
        return tenantIdList;
    }
}

